package com.petdog.infrastructure.mapper;

import com.petdog.module.admin.dto.AdminDashboardDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

/**
 * 数据统计Mapper接口
 */
@Mapper
public interface DataStatisticsMapper {
    
    /**
     * 统计总用户数
     */
    long countTotalUsers();
    
    /**
     * 统计总宠物数
     */
    long countTotalPets();
    
    /**
     * 统计总社区数
     */
    long countTotalCommunities();
    
    /**
     * 统计活跃社区数
     */
    long countActiveCommunities();
    
    /**
     * 统计总帖子数
     */
    long countTotalPosts();
    
    /**
     * 统计今日识别次数
     */
    long countTodayRecognitions();
    
    /**
     * 统计总识别次数
     */
    long countTotalRecognitions();
    
    /**
     * 统计今日活跃用户数
     */
    long countTodayActiveUsers();
    
    /**
     * 统计今日新增用户数
     */
    long countTodayNewUsers();
    
    /**
     * 统计今日新增内容数
     */
    long countTodayNewPosts();
    
    /**
     * 根据日期统计用户数
     */
    long countUsersByDate(@Param("date") LocalDate date);
    
    /**
     * 根据日期统计帖子数
     */
    long countPostsByDate(@Param("date") LocalDate date);
    
    /**
     * 根据日期统计识别次数
     */
    long countRecognitionsByDate(@Param("date") LocalDate date);
    
    /**
     * 根据日期统计评论数
     */
    long countCommentsByDate(@Param("date") LocalDate date);
    
    /**
     * 根据日期统计点赞数
     */
    long countLikesByDate(@Param("date") LocalDate date);
    
    /**
     * 根据日期统计活跃用户数
     */
    long countActiveUsersByDate(@Param("date") LocalDate date);
    
    /**
     * 获取指定时间范围内的每日统计数据
     */
    List<AdminDashboardDto.DailyStat> getDailyStats(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
    
    /**
     * 获取内容分布数据
     */
    AdminDashboardDto.ContentDistributionDto getContentDistribution(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
    
    /**
     * 获取社区活跃度数据
     */
    AdminDashboardDto.CommunityActivityDto getCommunityActivity(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
    
    /**
     * 获取AI识别数据
     */
    AdminDashboardDto.AiRecognitionDataDto getAiRecognitionData(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
    
    /**
     * 根据时间范围统计总用户数
     */
    long countUsersByTimeRange(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
    
    /**
     * 根据时间范围统计总内容数
     */
    long countPostsByTimeRange(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
    
    /**
     * 根据时间范围统计识别次数
     */
    long countRecognitionsByTimeRange(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
}
